package com.cencat.merchant.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cencat.common.exception.BusinessException;
import com.cencat.merchant.entity.Merchant;

import java.util.List;
import java.util.Map;

/**
 * 商家服务接口
 * @author cencat
 * @since 2024-01-01
 */
public interface MerchantService {

    /**
     * 创建商家
     * @param merchant 商家信息
     * @return 商家ID
     * @throws BusinessException 业务异常
     */
    Long createMerchant(Merchant merchant) throws BusinessException;

    /**
     * 更新商家信息
     * @param merchant 商家信息
     * @return 更新结果
     * @throws BusinessException 业务异常
     */
    Boolean updateMerchant(Merchant merchant) throws BusinessException;

    /**
     * 删除商家
     * @param merchantId 商家ID
     * @return 删除结果
     * @throws BusinessException 业务异常
     */
    Boolean deleteMerchant(Long merchantId) throws BusinessException;

    /**
     * 根据ID查询商家
     * @param merchantId 商家ID
     * @return 商家信息
     * @throws BusinessException 业务异常
     */
    Merchant getMerchantById(Long merchantId) throws BusinessException;

    /**
     * 根据商家编码查询商家
     * @param merchantCode 商家编码
     * @return 商家信息
     * @throws BusinessException 业务异常
     */
    Merchant getMerchantByCode(String merchantCode) throws BusinessException;

    /**
     * 根据租户ID查询商家列表
     * @param tenantId 租户ID
     * @return 商家列表
     */
    List<Merchant> getMerchantsByTenantId(Long tenantId);

    /**
     * 分页查询商家列表
     * @param page 分页参数
     * @param tenantId 租户ID
     * @param merchantName 商家名称（可选）
     * @param status 商家状态（可选）
     * @param merchantLevel 商家等级（可选）
     * @param auditStatus 审核状态（可选）
     * @return 分页结果
     */
    IPage<Merchant> getMerchantPage(Page<Merchant> page, 
                                   Long tenantId,
                                   String merchantName,
                                   String status,
                                   String merchantLevel,
                                   String auditStatus);

    /**
     * 审核商家
     * @param merchantId 商家ID
     * @param auditStatus 审核状态
     * @param auditRemark 审核意见
     * @param auditorId 审核人ID
     * @return 审核结果
     * @throws BusinessException 业务异常
     */
    Boolean auditMerchant(Long merchantId, String auditStatus, String auditRemark, Long auditorId) throws BusinessException;

    /**
     * 启用商家
     * @param merchantId 商家ID
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Boolean enableMerchant(Long merchantId) throws BusinessException;

    /**
     * 禁用商家
     * @param merchantId 商家ID
     * @return 操作结果
     * @throws BusinessException 业务异常
     */
    Boolean disableMerchant(Long merchantId) throws BusinessException;

    /**
     * 更新商家等级
     * @param merchantId 商家ID
     * @param level 商家等级
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean updateMerchantLevel(Long merchantId, Integer level) throws BusinessException;

    /**
     * 检查商家编码是否存在
     * @param merchantCode 商家编码
     * @param excludeId 排除的商家ID（用于更新时检查）
     * @return 是否存在
     */
    Boolean checkMerchantCodeExists(String merchantCode, Long excludeId);

    /**
     * 检查商家名称是否存在
     * @param merchantName 商家名称
     * @param excludeId 排除的商家ID（用于更新时检查）
     * @return 是否存在
     */
    Boolean checkMerchantNameExists(String merchantName, Long excludeId);

    /**
     * 生成商家编码
     * @param tenantId 租户ID
     * @return 商家编码
     */
    String generateMerchantCode(Long tenantId);

    /**
     * 统计租户下的商家数量
     * @param tenantId 租户ID
     * @return 商家数量
     */
    Long countMerchantsByTenantId(Long tenantId);

    /**
     * 统计各状态商家数量
     * @param tenantId 租户ID
     * @return 统计结果
     */
    Map<String, Long> countMerchantsByStatus(Long tenantId);

    /**
     * 批量导入商家
     * @param merchants 商家列表
     * @param tenantId 租户ID
     * @return 导入结果
     * @throws BusinessException 业务异常
     */
    Map<String, Object> batchImportMerchants(List<Merchant> merchants, Long tenantId) throws BusinessException;

    /**
     * 导出商家数据
     * @param tenantId 租户ID
     * @param merchantIds 商家ID列表（可选）
     * @return Excel文件字节数组
     */
    byte[] exportMerchants(Long tenantId, List<Long> merchantIds);

    /**
     * 导入商家数据
     * @param file Excel文件
     * @return 导入结果
     * @throws BusinessException 业务异常
     */
    Map<String, Object> importMerchants(org.springframework.web.multipart.MultipartFile file) throws BusinessException;
}